/*
 * MultiPartEditor.java
 *
 * Created on 16 December 2004, 03:39
 */

package org.owasp.webscarab.ui.swing.editors;

import javax.swing.JSplitPane;

import org.owasp.webscarab.model.MultiPartContent;
import org.owasp.webscarab.model.Message;

import javax.swing.AbstractListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import org.owasp.webscarab.ui.swing.MessagePanel;

/**
 *
 * @author  rogan
 */
public class MultiPartPanel extends javax.swing.JPanel implements ByteArrayEditor {
    
    /**
	 * 
	 */
	private static final long serialVersionUID = 7790954945202743857L;
	private byte[] _data = null;
    private boolean _modified = false;
    private boolean _editable = false;
    
    private MultiPartContent _content = null;
    private PartsListModel _partsList = new PartsListModel();
    private int _selected = -1;
    
    private MessagePanel _mp = null;
    
    /** Creates new form MultiPartEditor */
    public MultiPartPanel() {
        initComponents();
        setName("MultiPart");
        
        _mp = new MessagePanel(JSplitPane.HORIZONTAL_SPLIT);
        contentPanel.add(_mp);
        
        partList.setModel(_partsList);
        partList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        partList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
	    public void valueChanged(ListSelectionEvent evt) {
                if (evt.getValueIsAdjusting()) return;
                if (_editable && _mp.isModified() && _selected > -1) {
                    _modified = true;
                    Message message = _mp.getMessage();
                    _content.set(_selected, message);
                    _partsList.fireContentsChanged(_selected, _selected);
                }
                _selected = partList.getSelectedIndex();
                if (_selected < 0)
                    return;
                Message message = _content.get(_selected);
                _mp.setMessage(message);
                invalidate();
                revalidate();
            }
        });
    }
    
    public void setEditable(boolean editable) {
        _editable = editable;
        _mp.setEditable(editable);
    }
    
    public void setBytes(String contentType, byte[] bytes) {
        int size = 0;
        if (_content != null) {
            size = _content.size();
        }
        _modified = false;
        _data = bytes;
        _content = new MultiPartContent(contentType, bytes);
        if (size>0) {
            _partsList.fireIntervalRemoved(0, size-1);
        }
        if (_content.size()>0) {
            _partsList.fireIntervalAdded(0, _content.size()-1);
        }
    }
    
    public boolean isModified() {
        return (_editable && (_modified || _mp.isModified()));
    }
    
    public byte[] getBytes() {
        if (_editable && isModified()) {
            if (_mp.isModified()) {
                _content.set(_selected, _mp.getMessage());
            }
            _data = _content.getBytes();
            _modified = false;
        }
        return _data;
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        java.awt.GridBagConstraints gridBagConstraints;

        jScrollPane1 = new javax.swing.JScrollPane();
        partList = new javax.swing.JList();
        contentPanel = new javax.swing.JPanel();

        setLayout(new java.awt.GridBagLayout());

        jScrollPane1.setMinimumSize(new java.awt.Dimension(100, 22));
        jScrollPane1.setPreferredSize(new java.awt.Dimension(100, 131));
        jScrollPane1.setViewportView(partList);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
        gridBagConstraints.weighty = 1.0;
        add(jScrollPane1, gridBagConstraints);

        contentPanel.setLayout(new java.awt.BorderLayout());

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        add(contentPanel, gridBagConstraints);

    }//GEN-END:initComponents
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel contentPanel;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList partList;
    // End of variables declaration//GEN-END:variables
    
    private class PartsListModel extends AbstractListModel {
        
        /**
		 * 
		 */
		private static final long serialVersionUID = 690901016063929348L;

		public Object getElementAt(int index) {
            return _content.getPartName(index);
        }
        
        public int getSize() {
            if (_content == null) return 0;
            return _content.size();
        }
        
        public void fireIntervalAdded(int index0, int index1) {
            super.fireIntervalAdded(PartsListModel.this, index0, index1);
        }
        
        public void fireIntervalRemoved(int index0, int index1) {
            super.fireIntervalRemoved(PartsListModel.this, index0, index1);
        }
        
        public void fireContentsChanged(int index0, int index1) {
            super.fireContentsChanged(PartsListModel.this, index0, index1);
        }
        
    }
    
}
